(function registerDevtoolsFormatter() {
  // Guard: feature flag must be enabled in DevTools settings: Enable custom formatters
  try {
    const globalObj = (typeof window !== 'undefined') ? window : self;

    const FORMATTER_SYMBOL = Symbol.for('console-devtools-formatter-installed');
    if (globalObj[FORMATTER_SYMBOL]) {
      return;
    }

    // 确保 utils 已加载
    if (!globalObj.ConsoleFormatterUtils) {
      console.warn('ConsoleFormatterUtils 未加载，请确保 utils.js 已正确引入');
      return;
    }

    const Utils = globalObj.ConsoleFormatterUtils;
    
    // 初始化默认配置
    Utils.initDefaultConfig();
    
    // 加载配置
    let HEADER_PREVIEW_DEPTH = Utils.loadConfig(Utils.LS_KEYS.DEPTH, Utils.DEFAULT_HEADER_DEPTH);
    let MAX_CONTENT_LENGTH = Utils.loadConfig(Utils.LS_KEYS.LENGTH, Utils.MAX_CONTENT_LENGTH);
    let MAX_VALUE_WIDTH = Utils.loadConfig(Utils.LS_KEYS.VALUE_WIDTH, Utils.MAX_VALUE_WIDTH);
    let AUTO_FORMAT_ENABLED = Utils.loadConfig(Utils.LS_KEYS.AUTO, true);

    function eligibleForAuto(obj) {
      if (!AUTO_FORMAT_ENABLED) return false;
      if (!obj || typeof obj !== 'object') return false;
      // 只排除 JSON.stringify 无法处理的情况
      // 1. 函数 - JSON.stringify 会忽略函数
      if (typeof obj === 'function') return false;
      
      // 2. Window 对象 - JSON.stringify 会报错
      if (Utils.isWindowLike(obj)) return false;
      
      // 3. DOM 节点 - JSON.stringify 会报错
      if (Utils.isDomNode(obj)) return false;
      
      // 4. Symbol - JSON.stringify 会忽略 Symbol
      if (typeof obj === 'symbol') return false;
      
      // 5. 其他所有对象都允许格式化
      // 包括：普通对象、数组、Error、Date、RegExp、Map、Set、Promise、Proxy、Vue组件、React组件等
      return true;
    }

    const formatter = {
      header(obj) {
        // Auto format for plain objects / arrays
        if (eligibleForAuto(obj)) {
          // 更新 Utils 中的长度限制
          Utils.MAX_CONTENT_LENGTH = MAX_CONTENT_LENGTH;
          Utils.MAX_VALUE_WIDTH = MAX_VALUE_WIDTH;
          return Utils.renderJsonPreview(obj, HEADER_PREVIEW_DEPTH, Utils.MAX_ITEMS_PER_LEVEL);
        }
        return null;
      },
      hasBody(obj) {
        // 返回 false 禁用自定义 body，让 DevTools 使用原生展开行为
        return false;
      },
      // 自定义复制功能，确保复制的内容与当前层级设置一致
      copy(obj) {
        if (eligibleForAuto(obj)) {
          try {
            // 使用当前设置的层级深度来截断对象
            const truncated = Utils.truncateByDepth(obj, HEADER_PREVIEW_DEPTH, Utils.MAX_ITEMS_PER_LEVEL);
            return JSON.stringify(truncated, null, 2);
          } catch (e) {
            // 如果出错，返回原始对象的字符串表示
            return String(obj);
          }
        }
        // 对于不符合自动格式化条件的对象，返回原始值
        return obj;
      }
    };

    globalObj.devtoolsFormatters = globalObj.devtoolsFormatters || [];
    // Avoid duplicate registrations
    if (!globalObj.devtoolsFormatters.includes(formatter)) {
      globalObj.devtoolsFormatters.push(formatter);
    }

    // Provide helpers to mark objects and configure header preview depth at runtime
    // Usage:
    //   console.log(ConsoleFormatter.expand({ a: 1, b: 2 }, 'MyObj'))
    //   ConsoleFormatter.setHeaderDepth(4)
    globalObj.ConsoleFormatter = {
      setHeaderDepth(depth) {
        const n = Number(depth);
        if (!Number.isFinite(n) || n <= 0) {
          // eslint-disable-next-line no-console
          console.warn('[ConsoleFormatter] invalid depth:', depth);
          return HEADER_PREVIEW_DEPTH;
        }
        HEADER_PREVIEW_DEPTH = n;
        Utils.saveConfig(Utils.LS_KEYS.DEPTH, n);
        
        // 清空控制台并重新渲染
        this.clearAndRerender();
        
        // eslint-disable-next-line no-console
        console.log('[ConsoleFormatter] header preview depth =', n);
        return n;
      },
      getHeaderDepth() {
        return HEADER_PREVIEW_DEPTH;
      },
      enableAuto(on) {
        const flag = !!on;
        AUTO_FORMAT_ENABLED = flag;
        Utils.saveConfig(Utils.LS_KEYS.AUTO, flag ? '1' : '0');
        
        // 清空控制台并重新渲染
        this.clearAndRerender();
        
        // eslint-disable-next-line no-console
        console.log('[ConsoleFormatter] auto format =', flag ? 'ON' : 'OFF');
        return AUTO_FORMAT_ENABLED;
      },
      isAutoEnabled() {
        return AUTO_FORMAT_ENABLED;
      },
      setMaxLength(length) {
        const n = Number(length);
        if (!Number.isFinite(n) || n <= 0) {
          // eslint-disable-next-line no-console
          console.warn('[ConsoleFormatter] invalid max length:', length);
          return MAX_CONTENT_LENGTH;
        }
        MAX_CONTENT_LENGTH = n;
        Utils.saveConfig(Utils.LS_KEYS.LENGTH, n);
        
        // 清空控制台并重新渲染
        this.clearAndRerender();
        
        // eslint-disable-next-line no-console
        console.log('[ConsoleFormatter] max content length =', n);
        return n;
      },
      getMaxLength() {
        return MAX_CONTENT_LENGTH;
      },
      setMaxValueWidth(width) {
        const n = Number(width);
        if (!Number.isFinite(n) || n <= 0) {
          // eslint-disable-next-line no-console
          console.warn('[ConsoleFormatter] invalid value width:', width);
          return MAX_VALUE_WIDTH;
        }
        MAX_VALUE_WIDTH = n;
        Utils.saveConfig(Utils.LS_KEYS.VALUE_WIDTH, n);
        
        // 清空控制台并重新渲染
        this.clearAndRerender();
        
        // eslint-disable-next-line no-console
        console.log('[ConsoleFormatter] max value width =', n);
        return n;
      },
      getMaxValueWidth() {
        return MAX_VALUE_WIDTH;
      },
      resetToDefaults() {
        // 重置所有配置为默认值
        HEADER_PREVIEW_DEPTH = Utils.DEFAULT_HEADER_DEPTH;
        MAX_CONTENT_LENGTH = Utils.MAX_CONTENT_LENGTH;
        MAX_VALUE_WIDTH = Utils.MAX_VALUE_WIDTH;
        AUTO_FORMAT_ENABLED = true;
        
        // 保存默认配置到 localStorage
        Utils.saveConfig(Utils.LS_KEYS.DEPTH, HEADER_PREVIEW_DEPTH);
        Utils.saveConfig(Utils.LS_KEYS.LENGTH, MAX_CONTENT_LENGTH);
        Utils.saveConfig(Utils.LS_KEYS.VALUE_WIDTH, MAX_VALUE_WIDTH);
        Utils.saveConfig(Utils.LS_KEYS.AUTO, '1');
        
        // 清空控制台并重新渲染
        this.clearAndRerender();
        
        // eslint-disable-next-line no-console
        console.log('[ConsoleFormatter] 已重置为默认配置');
        // eslint-disable-next-line no-console
        console.log('默认配置：');
        // eslint-disable-next-line no-console
        console.log('- 预览层级：', HEADER_PREVIEW_DEPTH);
        // eslint-disable-next-line no-console
        console.log('- 内容长度限制：', MAX_CONTENT_LENGTH);
        // eslint-disable-next-line no-console
        console.log('- 值宽度限制：', MAX_VALUE_WIDTH);
        // eslint-disable-next-line no-console
        console.log('- 自动格式化：', AUTO_FORMAT_ENABLED ? 'ON' : 'OFF');
        
        return {
          headerDepth: HEADER_PREVIEW_DEPTH,
          maxLength: MAX_CONTENT_LENGTH,
          maxValueWidth: MAX_VALUE_WIDTH,
          autoEnabled: AUTO_FORMAT_ENABLED
        };
      },
      showFullContent(obj) {
        // 临时设置更大的长度限制来显示完整内容
        const originalLength = MAX_CONTENT_LENGTH;
        MAX_CONTENT_LENGTH = 999999; // 设置一个很大的值
        
        // eslint-disable-next-line no-console
        console.log('完整内容:', obj);
        
        // 恢复原始长度限制
        MAX_CONTENT_LENGTH = originalLength;
        
        // eslint-disable-next-line no-console
        console.log('已恢复长度限制:', originalLength);
      },
      clearAndRerender() {
        // 清空控制台，让用户重新输出内容来查看效果
        console.clear();
      },
      help() {
        // 打印一条示例与使用说明：若你看到的是普通对象结构，而不是样式化的 JSON 预览
        // 则说明 DevTools 未启用自定义格式化器
        try {
          // eslint-disable-next-line no-console
          console.info(
            '\n🔧 Console Formatter 功能说明：\n' +
            '• 自动格式化展开：默认开启，自动处理所有对象和数组\n' +
            '• 智能复制功能：右键复制时自动应用当前层级设置\n\n' +
            '⚙️ 控制命令：\n' +
            '• ConsoleFormatter.setHeaderDepth(3) - 设置预览层级\n' +
            '• ConsoleFormatter.setMaxLength(2048) - 设置内容长度限制\n' +
            '• ConsoleFormatter.setMaxValueWidth(80) - 设置值宽度限制\n' +
            '• ConsoleFormatter.enableAuto(true/false) - 开启/关闭自动格式化\n' +
            '• ConsoleFormatter.clearAndRerender() - 清空控制台\n' +
            '• ConsoleFormatter.getHeaderDepth() - 查看当前层级\n' +
            '• ConsoleFormatter.getMaxLength() - 查看当前长度限制\n' +
            '• ConsoleFormatter.getMaxValueWidth() - 查看当前值宽度限制\n' +
            '• ConsoleFormatter.showFullContent(obj) - 显示对象的完整内容\n' +
            '• ConsoleFormatter.resetToDefaults() - 重置为默认配置\n' +
            '• ConsoleFormatter.isAutoEnabled() - 查看自动格式化状态\n\n' +
            '❌ 如果显示为普通对象（如 {a: 1, b: {c: [1,2,3]}}），请按以下步骤开启：\n' +
            '1) 打开 DevTools（F12）\n' +
            '2) 打开设置（F1 或 ⚙️）\n' +
            '3) 勾选 "Enable custom formatters"（启用自定义格式化器）\n' +
            '4) 关闭并重新打开 DevTools 面板\n\n' +
            `📊 当前状态：\n` +
            `• 自动格式化：${AUTO_FORMAT_ENABLED ? '✅ 已开启' : '❌ 已关闭'}\n` +
            `• 预览层级：${HEADER_PREVIEW_DEPTH} 级\n` +
            `• 每层最大项目数：${Utils.MAX_ITEMS_PER_LEVEL} 个\n` +
            `• 内容长度限制：${MAX_CONTENT_LENGTH} 字符\n` +
            `• 值宽度限制：${MAX_VALUE_WIDTH} 字符\n` +
            `• 复制功能：✅ 已启用（复制内容与当前层级设置一致）`
          );
          const sample = {
            name: "测试对象",
            data: {
              id: 1,
              nested: {
                value: "深层值",
                array: [1, 2, 3]
              }
            },
            active: true,
            timestamp: Date.now()
          };

          // eslint-disable-next-line no-console
          console.log(
              '[ConsoleFormatter] 自检：以下应显示为样式化的 JSON 预览（带颜色和层级限制）否则需要你主动启动(自定义格式化器的配置)',
              sample
          );

        } catch (_) {
          // ignore
        }
      }
    };

    globalObj[FORMATTER_SYMBOL] = true;

    // 页面加载后立即显示提示
    try {
      // eslint-disable-next-line no-console
      console.log(
        '🎨 Console Formatter 已加载！',
        '输入 ConsoleFormatter.help() 查看详细说明'
      );
    } catch (_) {
      // ignore
    }
  } catch (e) {
    // Swallow errors to avoid interfering with page scripts
  }
})();


